#ifndef __FLASH_H
#define __FLASH_H

#ifdef __cplusplus
extern "C" {
#endif

#include "stdint.h"
#include "at32f421_flash.h"

// Flash 页大小（具体大小取决于芯片）
#define PAGE_SIZE           (uint16_t)0x0400  // 1KB
#define EEPROM_PAGE_COUNT   3  // 3 个物理页用于磨损均衡
#define PAGE_HEADER_SIZE    8  // 头部元数据大小（存储擦除计数和有效标志）

// Flash 地址定义
#define EEPROM_START_ADDRESS  ((uint32_t)0x0800F000)

// 页头信息偏移
#define ERASE_COUNTER_OFFSET  0  // 擦除次数存储在页的第 0 字节
#define DATA_VALID_FLAG_OFFSET  4  // 记录数据有效标志位

// 结构体数据存储起始偏移（防止覆盖头部）
#define DATA_OFFSET  PAGE_HEADER_SIZE  

// Flash 操作函数
void EEProm_To_RAM(uint16_t Page, uint16_t Len, uint16_t* Buffer);
uint32_t EEProm_To_RAM_One(uint16_t Page, uint16_t index);
void RAM_To_EEProm(uint16_t Page, uint16_t Len, uint16_t* Buffer);
void RAM_To_EEProm_One(uint16_t Page, uint16_t index, uint32_t Data, uint8_t EnableErase);

flash_status_type EEPROM_WriteStruct(uint16_t offset, const void* data, uint16_t size, uint8_t enableErase);
void EEPROM_ReadStruct(uint16_t offset, void* data, uint16_t size);

#ifdef __cplusplus
}
#endif

#endif /* __FLASH_H */
